package com.itts.hk.theard;

import org.junit.Test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 计算多线程的执行总时间
 */
public class TheardDate {
    /**
     *  Todo awaitTermination
     * 该函数所在线程会陷入阻塞，直到shutdown请求发出导致所有线程都结束、或者时间超时、或者当前线程被中断，这三个条件只要发生一个，线程就会跳出阻塞状态。
     * 加上了这行，main线程就会阻塞，后面计算执行时间的代码无法执行。直到所有线程执行结束或者到了一个小时（我的参数），才能计算时间。从而达到目的。
     */
    @Test
    public void test() {
        ExecutorService exec = Executors.newCachedThreadPool();
        long start = System.nanoTime();
        System.out.println(start);

        System.out.println("开始");
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            exec.execute(() -> {
                System.out.println(Thread.currentThread().getName() + "执行");
            });
        }
        exec.shutdown(); //所有线程都结束
        try {
            exec.awaitTermination(1, TimeUnit.HOURS); //到了一个小时或者更长时间（这行代码是关键）
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long time = System.nanoTime() - start;
        System.out.println(time);
        System.out.printf("Tasks took %.3f ms to run%n", time / 1e6);
    }
}
